package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.entity.*;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
@Transactional(rollbackFor = Exception.class) //开启事务    rollbackFor = Exception.class默认所有异常都回滚，默认情况下只能处理运行时异常

public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;


    @Autowired
    private EmpExprMapper empExprMapper;


    /**
     * 分页查询
     * @param
     * @param
     * @return
     */

//    @Override
//    public PageBean page(Integer page, Integer pageSize) {
//
//        //1.调用mapper查询数据总记录数 total
//        Long total = empMapper.count();
//
//        //2.调用mapper获取分页列表数据  rows
//        Integer start = (page-1)*pageSize; //计算起始索引
//        List<Emp> empList = empMapper.page(start, pageSize);
//
//        //3.封装到PageBean对象并返回
//
//        return new PageBean(total,empList);
//    }

//    @Override
//    public PageBean page(Integer page, Integer pageSize) {
//
//        //1.设置分页参数
//        PageHelper.startPage(page,pageSize);
//
//        //2.调用mapper的列表查询方法    分页只会作用于PageHelper.startPage下面的第一条 sql
//        List<Emp> empList = empMapper.list();
//        Page p=(Page) empList;  //强转
//
//        //3.封装到PageBean对象并返回
//        return new PageBean(p.getTotal(),p.getResult());
//    }


    @Override
    public PageBean page(EmpQueryParam param) {

        //1.设置分页参数
        PageHelper.startPage(param.getPage(),param.getPageSize());

        //2.调用mapper的列表查询方法    分页只会作用于PageHelper.startPage下面的第一条 sql
        List<Emp> empList = empMapper.list(param);
        Page p=(Page) empList;  //强转

        //3.封装到PageBean对象并返回
        return new PageBean(p.getTotal(),p.getResult());
    }


    /**
     * 新增员工
     * @param emp
     */

    @Override
    public void save(Emp emp) {

        //1.调用mapper方法，保存员工的基本信息到emp表
        //1.1补充缺失的字段
        emp.setPassword("123456");
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());

        //1.2调用mapper，保存员工的基本信息到emp表
        empMapper.insert(emp);

        Integer id = emp.getId();
        log.info("id={}",id);


        //2.调用mapper方法，保存员工的工作经历到emp_expr表
        List<EmpExpr> exprList = emp.getExprList();

        //2.1关联员工id
        if(!CollectionUtils.isEmpty(exprList))
        {
           exprList.forEach(expr -> expr.setEmpId(id));

           //2.2调用mapper方法，保存员工工作经历（批量插入）
            empExprMapper.insertBatch(exprList);
        }


    }

    /**
     * 删除员工
     * @param ids
     */

    @Transactional //0.开启事物
    @Override
    public void delete(List<Integer> ids) {

        //1.调用mapper方法，删除员工的基本信息数据
        empMapper.deleteBatch(ids);
        log.info("员工删除成功");

        //2.调用mapper方法，删除员工工作经历
        empExprMapper.deleteByEmpIds(ids);
        log.info("员工工作经历删除成功");

    }

    /**
     * 根据id查询员工
     * @param id
     * @return
     */
    @Override
    public Emp getById(Integer id) {
        //方式一：
//      1.调用mapper方法，根据id查询员工基本信息以及经历列表信息
//      return empMapper.getById(id);

        //方式二：
        //1.查询员工基本信息，封装到Emp对象中
        Emp emp = empMapper.getById2(id);

        //2.查询员工经历列表，封装到Emp对象中
        List<EmpExpr> exprList = empExprMapper.getByEmpId(id);
        emp.setExprList(exprList);//封装到Emp对象中

        //3.返回员工Emp对象
        return emp;
    }

    /**
     * 修改员工
     * @param emp
     */

    @Transactional //0.开启事物
    @Override
    public void update(Emp emp) {

        //1.修改员工的基本信息  emp表
        emp.setUpdateTime(LocalDateTime.now()); //补充基础属性

        empMapper.update(emp);
        log.info("员工修改成功");

        //2.修改员工工作经历  emp_expr表
        //先删后增
        empExprMapper.deleteByEmpID(emp.getId());
        List<EmpExpr> exprList = emp.getExprList();

        //判断集合是否为空
        if (!CollectionUtils.isEmpty(exprList)) {

            log.info("员工工作经历有数据");

            //关联员工id
            exprList.forEach(expr -> expr.setEmpId(emp.getId()));
            empExprMapper.insertBatch(exprList);
        }

    }

    /**
     * 员工登录
     * @param emp
     * @return
     */

    @Override
    public EmpLogininfo login(Emp emp) {

        //1.调用mapper方法，查询员工
        Emp loginEmp = empMapper.selectUsernameAndPassword(emp);

        //2.判断员工是否存在（数据是否为空）

        if (loginEmp != null) {
            //3.如果查到数据，则将数据封装到EmpLogininfo对象中并返回
            Map<String,Object> claims = new HashMap<>();
            claims.put("id",loginEmp.getId());
            claims.put("username",loginEmp.getUsername());

            //调用JWT工具类生成JWT令牌
            String jwt = JwtUtils.generateJwt(claims);
            log.info("生成JWT令牌：{}",jwt);
            return new EmpLogininfo(loginEmp.getId(),
                    loginEmp.getUsername(), loginEmp.getName(), jwt);
        }

        //4.如果没查到数据，则返回null
        log.info("用户名或密码错误");
        return null;
    }
}



















